import {FormRules} from "element-plus";
import {MaybeRef} from "vue";
import {PermsType} from "@/utils/directive/permission";
import {CommonEntity} from "@/utils/common-types";


// 在哪些地方展示这个属性
type DisplayOn = 'list' | 'add' | 'edit' | 'list-phone' // list表示不显示在table上, list-phone 表示当时手机界面的时候不显示在列表上,但宽度超过的时候会显示
type CommonFormType = 'input' | 'number' | 'percent' | 'textarea' | 'select' | 'radio' | 'image' | 'custom-select'|'custom' // custom-select为自定义搜索

export interface CommonTable<T extends Record<string, any> = Record<string, any>,
    R extends MaybeRef<string | Record<string, any>> = Record<string, any>> {
    api: {
        add: (data: T) => Promise<any>
        remove: (id: number) => Promise<any>
        edit: (id: number, data: T) => Promise<any>
        get: (id: number) => Promise<T>
        getList: (data: PageQuery<T>) => PromisePageListType<T>
    },
    attrs: {
        prop: keyof T, // 属性名
        label: string, // 页面名称
        formType?: CommonFormType, // 表单类型,目前仅支持这些,默认为string
        image?: {// 如果是图片的话,可以配置这个
            path?: string // 如果是image的话,可能需要path,path就是文件夹
            size?: number // 1-10 em
            borderRadius?: string
        }
        code?: string, // 如果是select的话,需要这个code
        notDisplayOn?: DisplayOn[] // 不在那些地方展示 table/add/edit
        columnWidth?: string | number, // table长度,默认120
        sort?: boolean // 是否排序,默认true,就是排序
        query?: boolean //这个字段是否查询,默认true
        placeholder?: string // 默认''
        format?: (column: T) => any,
        customSelect?: {// 如果formInputType为"custom-select"的时候需要传入搜索的api
            listApi: () => Promise<any[]> // 搜索的api
            label?: string, // 对应options上的label,默认name
            value?: string // 对应options上的value,默认id
            slotValues?: string[] // 展示options上的自定义插槽属性
        },
    }[]
    title: string// 标题
    perms?: { // 权限标识
        add?: PermsType
        remove?: PermsType
        edit?: PermsType
        view?: PermsType
    },
    queryData?: Partial<PageQuery<T>>, // 查询数据
    form: {
        labelWidth?: number | string, // label宽度 默认120
        dialogWidth?: number | string, // 弹出框的宽度 默认600
        initialForm: T,  // 最好初始化那些数字类型的值
        rules: FormRules<R>,
    },
}